#include <alt_types.h>
#include "arp.h"
#include "../utility.h"


static alt_u64	smac;				//!< MAC источника из последнего обработанного пакета
static alt_u64	dmac;				//!< MAC назначения из последнего обработанного пакета
static alt_u64	sip;				//!< IP источника из последнего обработанного пакета
static alt_u64	dip;				//!< IP назначения из последнего обработанного пакета
static alt_u64	mac;
static alt_u32	ip;

alt_u8 arp_set_mac(alt_u64 data)
{
	mac	= hton48(data);


	return 0;
}

alt_u8 arp_set_ip(alt_u32 data)
{
	ip	= hton32(data);
	return 0;
}

alt_u64 arp_get_smac()
{

	return hton48(smac);
}


alt_u8 arp_create_ask(alt_u8* req_frame, alt_u8* ask_frame)
{
	alt_u8			err = 0;
	arp_frame_t*	req;
	arp_frame_t* 	ask;

	req	= (arp_frame_t*)req_frame;
	ask	= (arp_frame_t*)ask_frame;

	// будем держать в сетевом виде, установленные значения преобразуются в сетевой вид при установке
	smac	= ntoh48(req->sha) & 0x0000FFFFFFFFFFFFLL;
	dmac	= ntoh48(req->tha) & 0x0000FFFFFFFFFFFFLL;
	sip		= ntoh32(req->spa);
	dip		= ntoh32(req->tpa);



	// Проверим совпадение полей фрейма
	if ((req->htype == hton16(HTYPE_ETH))  	&&
		(req->ptype == hton16(PTYPE_IPv4)) 	&&
		(req->opcode == hton16(OPCODE_REQ))	&&
		(req->tpa == ip))
	{
		ask->htype 		= hton16(HTYPE_ETH);
		ask->ptype 		= hton16(PTYPE_IPv4);
		ask->hlen		= HLEN_MAC;
		ask->plen 		= PLEN_IPv4;
		ask->opcode 	= hton16(OPCODE_ASK);
		ask->sha 		= mac;
		ask->spa 		= ip;
		ask->tha 		= req->sha;
		ask->tpa 		= req->spa;
	}
	else
	{
		err = 1;
	};

	return err;
}

alt_u8 arp_create_header(alt_u8* header)
{
	alt_u8			err = 0;
	arp_frame_t*	frame;


	frame	= (arp_frame_t*)header;


	frame->htype 	= hton16(HTYPE_ETH);
	frame->ptype 	= hton16(PTYPE_IPv4);
	frame->hlen		= HLEN_MAC;
	frame->plen 	= PLEN_IPv4;
	frame->opcode 	= hton16(OPCODE_REQ);
	frame->sha 		= hton48(0xd43d7e380096LL);
	frame->spa 		= hton32(conv_ipv4(192, 168, 21, 2));
	frame->tha 		= hton48(0);
	frame->tpa 		= hton32(conv_ipv4(192, 168, 21, 171));


	return err;
}
